﻿2026-05-16T23:43:17.7635449Z ##[group]Run pnpm verify:phase-5
2026-05-16T23:43:17.7635795Z [36;1mpnpm verify:phase-5[0m
2026-05-16T23:43:17.7669289Z shell: /usr/bin/bash -e {0}
2026-05-16T23:43:17.7669552Z env:
2026-05-16T23:43:17.7669762Z   SKIP_STAGING_VERIFY: false
2026-05-16T23:43:17.7670035Z   SKIP_PHASE_4_CARRYOVER: 
2026-05-16T23:43:17.7670275Z   SKIP_STAGING_SMOKE: true
2026-05-16T23:43:17.7670573Z   PNPM_HOME: /home/runner/setup-pnpm/node_modules/.bin
2026-05-16T23:43:17.7670902Z   SKIP_PHASE_3_CARRYOVER: 1
2026-05-16T23:43:17.7671147Z   SKIP_TRACE_CHECK: 1
2026-05-16T23:43:17.7671368Z ##[endgroup]
2026-05-16T23:43:18.0804539Z 
2026-05-16T23:43:18.0805619Z > rebno@0.0.0 verify:phase-5 /home/runner/work/rebno/rebno
2026-05-16T23:43:18.0806656Z > node scripts/verify-phase-5.mjs
2026-05-16T23:43:18.0807463Z 
2026-05-16T23:43:18.1119060Z 
2026-05-16T23:43:18.1119737Z === Phase 4 carry-over: verify-phase-4 ===
2026-05-16T23:43:18.1120634Z >>> pnpm verify:phase-4
2026-05-16T23:43:18.4288273Z 
2026-05-16T23:43:18.4289016Z > rebno@0.0.0 verify:phase-4 /home/runner/work/rebno/rebno
2026-05-16T23:43:18.4290183Z > node scripts/verify-phase-4.mjs
2026-05-16T23:43:18.4290824Z 
2026-05-16T23:43:18.4598644Z 
2026-05-16T23:43:18.4599205Z === Workspace: typecheck ===
2026-05-16T23:43:18.4600464Z >>> pnpm -r typecheck
2026-05-16T23:43:18.7895577Z Scope: 5 of 6 workspace projects
2026-05-16T23:43:18.7952443Z packages/db typecheck$ tsc --noEmit
2026-05-16T23:43:18.7961442Z packages/game-logic typecheck$ tsc --noEmit
2026-05-16T23:43:21.3528146Z packages/game-logic typecheck: Done
2026-05-16T23:43:21.3547724Z packages/protocol typecheck$ tsc --noEmit
2026-05-16T23:43:23.4376655Z packages/db typecheck: Done
2026-05-16T23:43:25.0276265Z packages/protocol typecheck: Done
2026-05-16T23:43:25.0282729Z apps/server typecheck$ tsc --noEmit
2026-05-16T23:43:25.0286076Z apps/client typecheck$ tsc --noEmit
2026-05-16T23:43:37.4568806Z apps/client typecheck: Done
2026-05-16T23:43:37.9718494Z apps/server typecheck: Done
2026-05-16T23:43:37.9841389Z 
2026-05-16T23:43:37.9842152Z === Lint: protocol-sync ===
2026-05-16T23:43:37.9843325Z >>> pnpm lint:protocol-sync
2026-05-16T23:43:38.2885478Z 
2026-05-16T23:43:38.2886650Z > rebno@0.0.0 lint:protocol-sync /home/runner/work/rebno/rebno
2026-05-16T23:43:38.2888519Z > node tools/scripts/lint-protocol-sync.mjs
2026-05-16T23:43:38.2889304Z 
2026-05-16T23:43:38.3173253Z lint-protocol-sync: OK
2026-05-16T23:43:38.3281996Z 
2026-05-16T23:43:38.3283589Z === Lint: game-logic-purity ===
2026-05-16T23:43:38.3284830Z >>> pnpm lint:game-logic-purity
2026-05-16T23:43:38.6284313Z 
2026-05-16T23:43:38.6285335Z > rebno@0.0.0 lint:game-logic-purity /home/runner/work/rebno/rebno
2026-05-16T23:43:38.6288538Z > node tools/scripts/lint-game-logic-purity.mjs
2026-05-16T23:43:38.6289001Z 
2026-05-16T23:43:38.6590007Z lint-game-logic-purity: OK (8 file(s) clean)
2026-05-16T23:43:38.6700521Z 
2026-05-16T23:43:38.6701143Z === Lint: better-auth-schema-sync ===
2026-05-16T23:43:38.6702745Z >>> pnpm lint:better-auth-schema-sync
2026-05-16T23:43:38.9694974Z 
2026-05-16T23:43:38.9696615Z > rebno@0.0.0 lint:better-auth-schema-sync /home/runner/work/rebno/rebno
2026-05-16T23:43:38.9705947Z > node tools/scripts/lint-better-auth-schema-sync.mjs
2026-05-16T23:43:38.9707112Z 
2026-05-16T23:43:40.6333314Z lint-better-auth-schema-sync: OK
2026-05-16T23:43:40.6450308Z 
2026-05-16T23:43:40.6451005Z === Lint: rate-limit-budgets ===
2026-05-16T23:43:40.6451839Z >>> pnpm lint:rate-limit-budgets
2026-05-16T23:43:40.9499456Z 
2026-05-16T23:43:40.9500271Z > rebno@0.0.0 lint:rate-limit-budgets /home/runner/work/rebno/rebno
2026-05-16T23:43:40.9501194Z > node tools/scripts/lint-rate-limit-budgets.mjs
2026-05-16T23:43:40.9501648Z 
2026-05-16T23:43:40.9798569Z lint-rate-limit-budgets: OK (5 D-22 budgets locked)
2026-05-16T23:43:40.9909812Z 
2026-05-16T23:43:40.9910335Z === Lint: no-clipboard-rce ===
2026-05-16T23:43:40.9911127Z >>> pnpm lint:no-clipboard-rce
2026-05-16T23:43:41.2950998Z 
2026-05-16T23:43:41.2952056Z > rebno@0.0.0 lint:no-clipboard-rce /home/runner/work/rebno/rebno
2026-05-16T23:43:41.2954008Z > node tools/scripts/lint-no-clipboard-rce.mjs
2026-05-16T23:43:41.2954729Z 
2026-05-16T23:43:41.3301150Z lint-no-clipboard-rce: OK (23 file(s) clean)
2026-05-16T23:43:41.3412928Z 
2026-05-16T23:43:41.3413447Z === Lint: room-layout ===
2026-05-16T23:43:41.3414243Z >>> pnpm lint:room-layout
2026-05-16T23:43:41.6419435Z 
2026-05-16T23:43:41.6420513Z > rebno@0.0.0 lint:room-layout /home/runner/work/rebno/rebno
2026-05-16T23:43:41.6421687Z > node tools/scripts/lint-room-layout.mjs
2026-05-16T23:43:41.6422324Z 
2026-05-16T23:43:41.6780720Z lint-room-layout: OK
2026-05-16T23:43:41.6892494Z 
2026-05-16T23:43:41.6892939Z === ADR 0004 lint ===
2026-05-16T23:43:41.6893604Z >>> pnpm lint:adr:0004
2026-05-16T23:43:41.9915043Z 
2026-05-16T23:43:41.9916052Z > rebno@0.0.0 lint:adr:0004 /home/runner/work/rebno/rebno
2026-05-16T23:43:41.9917955Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0004-room-hot-reload.md --no-matrix
2026-05-16T23:43:41.9919031Z 
2026-05-16T23:43:42.0222865Z OK: ADR docs/adr/0004-room-hot-reload.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-16T23:43:42.0336298Z 
2026-05-16T23:43:42.0336830Z === Drizzle: emit-check ===
2026-05-16T23:43:42.0337893Z >>> pnpm db:emit-check
2026-05-16T23:43:42.3374795Z 
2026-05-16T23:43:42.3375865Z > rebno@0.0.0 db:emit-check /home/runner/work/rebno/rebno
2026-05-16T23:43:42.3379762Z > pnpm -C packages/db exec drizzle-kit generate && node -e "require('fs').copyFileSync('packages/db/migrations/0001_baseline.sql','docs/extracted-server/0001_baseline.sql')" && git diff --exit-code packages/db/migrations/0001_baseline.sql docs/extracted-server/0001_baseline.sql
2026-05-16T23:43:42.3382043Z 
2026-05-16T23:43:42.7942565Z No config path provided, using default 'drizzle.config.ts'
2026-05-16T23:43:42.7944838Z Reading config file '/home/runner/work/rebno/rebno/packages/db/drizzle.config.ts'
2026-05-16T23:43:43.2337787Z 8 tables
2026-05-16T23:43:43.2338613Z accounts 8 columns 1 indexes 0 fks
2026-05-16T23:43:43.2339589Z audit_log 6 columns 0 indexes 2 fks
2026-05-16T23:43:43.2340551Z characters 9 columns 0 indexes 1 fks
2026-05-16T23:43:43.2341499Z inventory_items 4 columns 0 indexes 1 fks
2026-05-16T23:43:43.2342497Z legacy_credentials_staging 6 columns 0 indexes 0 fks
2026-05-16T23:43:43.2343487Z message_board_replies 5 columns 0 indexes 2 fks
2026-05-16T23:43:43.2344506Z message_board_topics 7 columns 0 indexes 1 fks
2026-05-16T23:43:43.2345432Z sessions 5 columns 0 indexes 1 fks
2026-05-16T23:43:43.2346028Z 
2026-05-16T23:43:43.2346828Z No schema changes, nothing to migrate 😴
2026-05-16T23:43:43.8225867Z 
2026-05-16T23:43:43.8226625Z === Drizzle: schema-sync ===
2026-05-16T23:43:43.8227926Z >>> pnpm lint:schema-sync
2026-05-16T23:43:44.1298527Z 
2026-05-16T23:43:44.1299569Z > rebno@0.0.0 lint:schema-sync /home/runner/work/rebno/rebno
2026-05-16T23:43:44.1303440Z > node -e "const a=require('fs').readFileSync('packages/db/migrations/0001_baseline.sql');const b=require('fs').readFileSync('docs/extracted-server/0001_baseline.sql');if(Buffer.compare(a,b)!==0){console.error('docs/extracted-server/0001_baseline.sql out of sync with packages/db/migrations/0001_baseline.sql');process.exit(1)}console.log('OK')"
2026-05-16T23:43:44.1306349Z 
2026-05-16T23:43:44.1559470Z OK
2026-05-16T23:43:44.1679227Z 
2026-05-16T23:43:44.1679934Z === Drizzle: source-comments ===
2026-05-16T23:43:44.1680830Z >>> pnpm lint:source-comments
2026-05-16T23:43:44.4752976Z 
2026-05-16T23:43:44.4754058Z > rebno@0.0.0 lint:source-comments /home/runner/work/rebno/rebno
2026-05-16T23:43:44.4755343Z > pnpm -C packages/db run lint:source-comments
2026-05-16T23:43:44.4756118Z 
2026-05-16T23:43:44.7858063Z 
2026-05-16T23:43:44.7859276Z > @rebno/db@0.1.0 lint:source-comments /home/runner/work/rebno/rebno/packages/db
2026-05-16T23:43:44.7860789Z > node scripts/check-source-comments.mjs
2026-05-16T23:43:44.7861466Z 
2026-05-16T23:43:44.8160595Z check-source-comments: OK (50 columns, all SOURCE-cited)
2026-05-16T23:43:44.8370018Z 
2026-05-16T23:43:44.8370758Z === Workspace: test ===
2026-05-16T23:43:44.8371974Z >>> pnpm -r test
2026-05-16T23:43:45.1527963Z Scope: 5 of 6 workspace projects
2026-05-16T23:43:45.1584241Z packages/db test$ vitest run
2026-05-16T23:43:45.1593315Z packages/game-logic test$ vitest run
2026-05-16T23:43:45.6739227Z packages/db test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/db[39m
2026-05-16T23:43:45.6741811Z packages/game-logic test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/game-logic[39m
2026-05-16T23:43:46.0909625Z packages/game-logic test:  [32m✓[39m test/step-bno-fidelity.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-16T23:43:46.3194841Z packages/game-logic test:  [32m✓[39m test/collision-axis-slide.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-16T23:43:46.5374884Z packages/game-logic test:  [32m✓[39m test/wall-slide.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-16T23:43:46.7408105Z packages/db test:  [32m✓[39m tests/promotion.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-16T23:43:46.7898989Z packages/game-logic test:  [32m✓[39m test/golden.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-16T23:43:47.0062600Z packages/db test:  [32m✓[39m tests/save-format-traceability.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-16T23:43:47.0172332Z packages/game-logic test:  [32m✓[39m test/navi-mask-bbox.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T23:43:47.2509038Z packages/game-logic test:  [32m✓[39m test/walkable-edge.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-16T23:43:47.4911058Z packages/game-logic test:  [32m✓[39m test/movement-constants.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-16T23:43:47.7062670Z packages/game-logic test:  [32m✓[39m test/sprite-state-machine.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-16T23:43:47.7832491Z packages/db test:  [32m✓[39m tests/schema-shape.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-16T23:43:47.8005815Z packages/db test: [2m Test Files [22m [1m[32m3 passed[39m[22m[90m (3)[39m
2026-05-16T23:43:47.8028817Z packages/db test: [2m      Tests [22m [1m[32m22 passed[39m[22m[90m (22)[39m
2026-05-16T23:43:47.8268840Z packages/db test: [2m   Start at [22m 23:43:45
2026-05-16T23:43:47.8288904Z packages/db test: [2m   Duration [22m 2.10s[2m (transform 215ms, setup 0ms, import 1.45s, tests 31ms, environment 1ms)[22m
2026-05-16T23:43:47.8328804Z packages/db test: Done
2026-05-16T23:43:47.8329851Z packages/protocol test$ vitest run
2026-05-16T23:43:47.9872036Z packages/game-logic test:  [32m✓[39m test/platform-cycle.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 17[2mms[22m[39m
2026-05-16T23:43:48.2151945Z packages/game-logic test:  [32m✓[39m test/accumulator.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-16T23:43:48.3729529Z packages/protocol test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/protocol[39m
2026-05-16T23:43:48.4499665Z packages/game-logic test:  [32m✓[39m test/run-speed.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-16T23:43:48.6693487Z packages/game-logic test:  [32m✓[39m test/rng.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-16T23:43:48.6695597Z packages/game-logic test: [2m Test Files [22m [1m[32m12 passed[39m[22m[90m (12)[39m
2026-05-16T23:43:48.6697911Z packages/game-logic test: [2m      Tests [22m [1m[32m61 passed[39m[22m[90m (61)[39m
2026-05-16T23:43:48.6706238Z packages/game-logic test: [2m   Start at [22m 23:43:45
2026-05-16T23:43:48.6708834Z packages/game-logic test: [2m   Duration [22m 2.98s[2m (transform 245ms, setup 0ms, import 487ms, tests 105ms, environment 2ms)[22m
2026-05-16T23:43:48.7339611Z packages/game-logic test: Done
2026-05-16T23:43:48.7489127Z packages/protocol test:  [32m✓[39m test/intents.test.ts [2m([22m[2m15 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-16T23:43:48.9382501Z packages/protocol test:  [32m✓[39m test/codec.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-16T23:43:49.1101877Z packages/protocol test:  [32m✓[39m test/state.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-16T23:43:49.2583191Z packages/protocol test:  [32m✓[39m test/schema-shape.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-16T23:43:49.2619591Z packages/protocol test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-16T23:43:49.2642773Z packages/protocol test: [2m      Tests [22m [1m[32m41 passed[39m[22m[90m (41)[39m
2026-05-16T23:43:49.2643976Z packages/protocol test: [2m   Start at [22m 23:43:48
2026-05-16T23:43:49.2645632Z packages/protocol test: [2m   Duration [22m 898ms[2m (transform 138ms, setup 0ms, import 272ms, tests 37ms, environment 1ms)[22m
2026-05-16T23:43:49.2946750Z packages/protocol test: Done
2026-05-16T23:43:49.2952261Z apps/client test$ vitest run --exclude 'test/e2e/**'
2026-05-16T23:43:49.2955099Z apps/server test$ vitest run --exclude 'test/**/*.integ.test.ts'
2026-05-16T23:43:49.8153307Z apps/server test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/apps/server[39m
2026-05-16T23:43:49.8998891Z apps/client test: [1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/home/runner/work/rebno/rebno/apps/client[39m
2026-05-16T23:43:50.9864374Z apps/server test:  [32m✓[39m test/persistence.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 65[2mms[22m[39m
2026-05-16T23:43:51.4829269Z apps/client test:  [32m✓[39m src/__test__/nameplate-stability.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 46[2mms[22m[39m
2026-05-16T23:43:51.5009705Z apps/server test:  [32m✓[39m test/layout-derive.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 146[2mms[22m[39m
2026-05-16T23:43:51.8165734Z apps/server test:  [32m✓[39m test/static-assets.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-16T23:43:52.0574112Z apps/server test:  [32m✓[39m test/rate-limit.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-16T23:43:52.3174822Z apps/server test:  [32m✓[39m test/room-key.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 22[2mms[22m[39m
2026-05-16T23:43:52.5769129Z apps/server test: {"level":40,"time":1778975032573,"pid":3267,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-16T23:43:52.5834773Z apps/server test: {"level":40,"time":1778975032577,"pid":3267,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-16T23:43:52.5868517Z apps/server test: {"level":40,"time":1778975032577,"pid":3267,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-16T23:43:52.5888993Z apps/server test:  [32m✓[39m test/staging-invite.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-16T23:43:53.2334351Z apps/client test: [90mstderr[2m | src/__test__/game-scene.test.ts[2m > [22m[2mscenes/GameScene[2m > [22m[2mtest 5: onRoomLayout calls verifyRoomLayout first; render skipped on false
2026-05-16T23:43:53.2358570Z apps/client test: [22m[39mroom_layout signature did not verify — rendering anyway (defense-in-depth; see 06.1-D40-SPIKE.md) mvp-lobby 000
2026-05-16T23:43:53.3314658Z apps/client test:  [32m✓[39m src/__test__/game-scene.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 259[2mms[22m[39m
2026-05-16T23:43:53.5368891Z apps/server test: {"level":30,"time":1778975033535,"pid":3278,"hostname":"runnervmrw5os","password":"[Redacted]","session_token":"[Redacted]","msg":"login"}
2026-05-16T23:43:53.5398629Z apps/server test:  [32m✓[39m test/otel-init.test.ts [2m([22m[2m4 tests[22m[2m)[22m[33m 701[2mms[22m[39m
2026-05-16T23:43:53.5468485Z apps/server test:      [33m[2m✓[22m[39m does not throw when OTEL_EXPORTER_OTLP_ENDPOINT is unset [33m 587[2mms[22m[39m
2026-05-16T23:43:54.5219180Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-16T23:43:54.5224168Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-z3YrNY/rebno.db
2026-05-16T23:43:54.5241539Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-16T23:43:54.5243880Z apps/server test: [run-migrations] OK
2026-05-16T23:43:54.5345668Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-16T23:43:54.5351919Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-Qnq6k0/rebno.db
2026-05-16T23:43:54.5356052Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-16T23:43:54.5369978Z apps/server test: [run-migrations] reconciled __drizzle_migrations for pre-bootstrap DB (Assumption A7) — seeded 0001_baseline
2026-05-16T23:43:54.5372412Z apps/server test: [run-migrations] OK
2026-05-16T23:43:54.5409127Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-16T23:43:54.5438283Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-GLJbNS/rebno.db
2026-05-16T23:43:54.5450200Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-16T23:43:54.5467662Z apps/server test: [run-migrations] OK
2026-05-16T23:43:54.5469784Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-16T23:43:54.5494665Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-GLJbNS/rebno.db
2026-05-16T23:43:54.5512162Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-16T23:43:54.5537616Z apps/server test: [run-migrations] OK
2026-05-16T23:43:54.5559195Z apps/server test:  [32m✓[39m test/run-migrations.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 52[2mms[22m[39m
2026-05-16T23:43:54.6256165Z apps/client test:  [32m✓[39m src/__test__/sprite-state-machine.teleport-gate.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 117[2mms[22m[39m
2026-05-16T23:43:54.8459014Z apps/server test:  [32m✓[39m test/log.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 25[2mms[22m[39m
2026-05-16T23:43:55.1082785Z apps/server test:  [32m✓[39m test/admin-stubs.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-16T23:43:55.3818963Z apps/server test:  [32m✓[39m test/legacy-login.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 24[2mms[22m[39m
2026-05-16T23:43:55.6095398Z apps/server test:  [32m✓[39m test/health.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T23:43:55.8023265Z apps/client test:  [32m✓[39m src/__test__/nameplate.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 65[2mms[22m[39m
2026-05-16T23:43:56.4850957Z apps/server test: [90mstdout[2m | test/tick-accumulator.test.ts
2026-05-16T23:43:56.4889201Z apps/server test: [22m[39m◇ injected env (50) from ../../../../../../../etc/environment // tip: ⌘ override existing { override: true }
2026-05-16T23:43:56.4892324Z apps/server test: ℹ️  optional .env file not found: .env.test, .env
2026-05-16T23:43:57.0531521Z apps/client test:  [32m✓[39m src/__test__/colyseus-client.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 19[2mms[22m[39m
2026-05-16T23:43:57.1904733Z apps/server test:  [32m✓[39m test/tick-accumulator.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-16T23:43:57.2042615Z apps/server test: [2m Test Files [22m [1m[32m13 passed[39m[22m[90m (13)[39m
2026-05-16T23:43:57.2064501Z apps/server test: [2m      Tests [22m [1m[32m78 passed[39m[22m[90m (78)[39m
2026-05-16T23:43:57.2074115Z apps/server test: [2m   Start at [22m 23:43:49
2026-05-16T23:43:57.2076005Z apps/server test: [2m   Duration [22m 7.36s[2m (transform 575ms, setup 0ms, import 3.49s, tests 1.10s, environment 2ms)[22m
2026-05-16T23:43:57.2468115Z apps/server test: Done
2026-05-16T23:43:57.7867475Z apps/client test:  [32m✓[39m src/__test__/sprite-state-machine.test.ts [2m([22m[2m29 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T23:43:58.4851832Z apps/client test:  [32m✓[39m src/__test__/login-scene.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 12[2mms[22m[39m
2026-05-16T23:43:59.2784780Z apps/client test:  [32m✓[39m src/__test__/reconnect.test.ts [2m([22m[2m16 tests[22m[2m)[22m[32m 73[2mms[22m[39m
2026-05-16T23:43:59.9500529Z apps/client test:  [32m✓[39m src/__test__/player-renderer.teleport.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-16T23:44:00.6311244Z apps/client test:  [32m✓[39m src/__test__/player-renderer-spawn-delay.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 20[2mms[22m[39m
2026-05-16T23:44:01.3049271Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 16[2mms[22m[39m
2026-05-16T23:44:02.0325561Z apps/client test:  [32m✓[39m src/__test__/chat-hud.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 85[2mms[22m[39m
2026-05-16T23:44:02.7141354Z apps/client test:  [32m✓[39m src/__test__/nameplate-color.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 32[2mms[22m[39m
2026-05-16T23:44:03.4335604Z apps/client test: [90mstderr[2m | src/__test__/background-renderer.test.ts[2m > [22m[2mBackgroundRenderer — wrap math (sim-tick pure state)[2m > [22m[2mD-64 round-4: dispose() survives a group whose .clear() throws (scene-shutdown race)
2026-05-16T23:44:03.4340843Z apps/client test: [22m[39mBackgroundRenderer.dispose: group.clear threw (likely scene-shutdown race) Cannot read properties of undefined (reading 'size')
2026-05-16T23:44:03.4351872Z apps/client test:  [32m✓[39m src/__test__/background-renderer.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 80[2mms[22m[39m
2026-05-16T23:44:04.0989795Z apps/client test:  [32m✓[39m src/__test__/reconciler.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T23:44:04.7560862Z apps/client test:  [32m✓[39m src/__test__/room-renderer.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-16T23:44:05.4710562Z apps/client test:  [32m✓[39m src/__test__/force-reset-overlay.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 72[2mms[22m[39m
2026-05-16T23:44:06.2074717Z apps/client test:  [32m✓[39m src/__test__/esc-menu.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 79[2mms[22m[39m
2026-05-16T23:44:06.8494625Z apps/client test:  [32m✓[39m src/__test__/prediction.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-16T23:44:07.5091681Z apps/client test:  [32m✓[39m src/__test__/extrapolation.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-16T23:44:08.1682986Z apps/client test:  [32m✓[39m src/__test__/sprite-state-rate.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-16T23:44:08.8232774Z apps/client test:  [32m✓[39m src/__test__/room-layout-verify.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-16T23:44:09.4900510Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher-shift.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-16T23:44:10.1568574Z apps/client test:  [32m✓[39m src/__test__/boot-font-gate.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T23:44:10.8173059Z apps/client test:  [32m✓[39m src/__test__/legacy-origin.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-16T23:44:11.5450033Z apps/client test:  [32m✓[39m src/__test__/auth-client.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T23:44:12.1911492Z apps/client test:  [32m✓[39m src/__test__/room-collision-bottom-edge.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-16T23:44:12.8529353Z apps/client test:  [32m✓[39m src/__test__/depth-set.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-16T23:44:13.5052701Z apps/client test:  [32m✓[39m src/__test__/atlas-loader.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-16T23:44:14.1804916Z apps/client test:  [32m✓[39m src/__test__/protocol-version-check.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-16T23:44:14.8709930Z apps/client test:  [32m✓[39m src/__test__/env.test.ts [2m([22m[2m5 tests[22m[2m | [22m[33m4 skipped[39m[2m)[22m[32m 4[2mms[22m[39m
2026-05-16T23:44:14.8930209Z apps/client test: [2m Test Files [22m [1m[32m31 passed[39m[22m[90m (31)[39m
2026-05-16T23:44:14.8932645Z apps/client test: [2m      Tests [22m [1m[32m223 passed[39m[22m[2m | [22m[90m4 todo[39m[90m (227)[39m
2026-05-16T23:44:14.8957962Z apps/client test: [2m   Start at [22m 23:43:49
2026-05-16T23:44:14.8978680Z apps/client test: [2m   Duration [22m 24.99s[2m (transform 938ms, setup 60ms, collect 1.79s, tests 1.08s, environment 14.36s, prepare 2.83s)[22m
2026-05-16T23:44:15.0222479Z apps/client test: Done
2026-05-16T23:44:15.0301345Z 
2026-05-16T23:44:15.0301931Z verify-phase-4: OK (12 steps green)
2026-05-16T23:44:15.0415674Z 
2026-05-16T23:44:15.0416251Z === Workspace: typecheck ===
2026-05-16T23:44:15.0417346Z >>> pnpm -r typecheck
2026-05-16T23:44:15.3505879Z Scope: 5 of 6 workspace projects
2026-05-16T23:44:15.3561815Z packages/db typecheck$ tsc --noEmit
2026-05-16T23:44:15.3571512Z packages/game-logic typecheck$ tsc --noEmit
2026-05-16T23:44:17.9509515Z packages/game-logic typecheck: Done
2026-05-16T23:44:17.9517360Z packages/protocol typecheck$ tsc --noEmit
2026-05-16T23:44:20.2993271Z packages/db typecheck: Done
2026-05-16T23:44:21.5643210Z packages/protocol typecheck: Done
2026-05-16T23:44:21.5650488Z apps/server typecheck$ tsc --noEmit
2026-05-16T23:44:21.5653704Z apps/client typecheck$ tsc --noEmit
2026-05-16T23:44:33.9826643Z apps/client typecheck: Done
2026-05-16T23:44:34.5369337Z apps/server typecheck: Done
2026-05-16T23:44:34.5466536Z 
2026-05-16T23:44:34.5467712Z === Lint: deploy-stack ===
2026-05-16T23:44:34.5468504Z >>> pnpm lint:deploy-stack
2026-05-16T23:44:34.8484472Z 
2026-05-16T23:44:34.8485490Z > rebno@0.0.0 lint:deploy-stack /home/runner/work/rebno/rebno
2026-05-16T23:44:34.8486851Z > node tools/scripts/lint-deploy-stack.mjs
2026-05-16T23:44:34.8487843Z 
2026-05-16T23:44:34.8776666Z lint-deploy-stack: OK
2026-05-16T23:44:34.8894386Z 
2026-05-16T23:44:34.8895017Z === Lint: deploy-stack test ===
2026-05-16T23:44:34.8895884Z >>> pnpm lint:deploy-stack:test
2026-05-16T23:44:35.1907902Z 
2026-05-16T23:44:35.1908965Z > rebno@0.0.0 lint:deploy-stack:test /home/runner/work/rebno/rebno
2026-05-16T23:44:35.1910347Z > node tools/scripts/lint-deploy-stack.test.mjs
2026-05-16T23:44:35.1911005Z 
2026-05-16T23:44:35.2514583Z PASS: lint-deploy-stack green
2026-05-16T23:44:35.2635164Z 
2026-05-16T23:44:35.2635643Z === ADR 0005 lint ===
2026-05-16T23:44:35.2636499Z >>> pnpm lint:adr:0005
2026-05-16T23:44:35.5693423Z 
2026-05-16T23:44:35.5694463Z > rebno@0.0.0 lint:adr:0005 /home/runner/work/rebno/rebno
2026-05-16T23:44:35.5696098Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0005-deploy-topology.md --no-matrix
2026-05-16T23:44:35.5697404Z 
2026-05-16T23:44:35.5989572Z OK: ADR docs/adr/0005-deploy-topology.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-16T23:44:35.6105875Z 
2026-05-16T23:44:35.6106353Z === ADR 0006 lint ===
2026-05-16T23:44:35.6108156Z >>> pnpm lint:adr:0006
2026-05-16T23:44:35.9155550Z 
2026-05-16T23:44:35.9156558Z > rebno@0.0.0 lint:adr:0006 /home/runner/work/rebno/rebno
2026-05-16T23:44:35.9167796Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0006-observability-stack.md --no-matrix
2026-05-16T23:44:35.9169217Z 
2026-05-16T23:44:35.9476794Z OK: ADR docs/adr/0006-observability-stack.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-16T23:44:35.9592077Z 
2026-05-16T23:44:35.9592658Z === Workspace: test ===
2026-05-16T23:44:35.9593352Z >>> pnpm -r test
2026-05-16T23:44:36.2710329Z Scope: 5 of 6 workspace projects
2026-05-16T23:44:36.2767535Z packages/db test$ vitest run
2026-05-16T23:44:36.2776537Z packages/game-logic test$ vitest run
2026-05-16T23:44:36.7639560Z packages/game-logic test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/game-logic[39m
2026-05-16T23:44:36.8149997Z packages/db test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/db[39m
2026-05-16T23:44:37.1571796Z packages/game-logic test:  [32m✓[39m test/platform-cycle.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 20[2mms[22m[39m
2026-05-16T23:44:37.4186757Z packages/game-logic test:  [32m✓[39m test/step-bno-fidelity.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 17[2mms[22m[39m
2026-05-16T23:44:37.6473905Z packages/game-logic test:  [32m✓[39m test/golden.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-16T23:44:37.8409321Z packages/db test:  [32m✓[39m tests/schema-shape.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-16T23:44:37.8766420Z packages/game-logic test:  [32m✓[39m test/rng.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-16T23:44:38.1096562Z packages/game-logic test:  [32m✓[39m test/collision-axis-slide.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-16T23:44:38.3405066Z packages/game-logic test:  [32m✓[39m test/sprite-state-machine.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T23:44:38.5510122Z packages/game-logic test:  [32m✓[39m test/accumulator.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T23:44:38.7000868Z packages/db test:  [32m✓[39m tests/promotion.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-16T23:44:38.7889579Z packages/game-logic test:  [32m✓[39m test/movement-constants.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-16T23:44:38.9279211Z packages/db test:  [32m✓[39m tests/save-format-traceability.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-16T23:44:38.9361332Z packages/db test: [2m Test Files [22m [1m[32m3 passed[39m[22m[90m (3)[39m
2026-05-16T23:44:38.9369476Z packages/db test: [2m      Tests [22m [1m[32m22 passed[39m[22m[90m (22)[39m
2026-05-16T23:44:38.9387945Z packages/db test: [2m   Start at [22m 23:44:36
2026-05-16T23:44:38.9408505Z packages/db test: [2m   Duration [22m 2.11s[2m (transform 203ms, setup 0ms, import 1.48s, tests 32ms, environment 1ms)[22m
2026-05-16T23:44:38.9662589Z packages/db test: Done
2026-05-16T23:44:38.9671294Z packages/protocol test$ vitest run
2026-05-16T23:44:39.0229268Z packages/game-logic test:  [32m✓[39m test/navi-mask-bbox.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-16T23:44:39.3048994Z packages/game-logic test:  [32m✓[39m test/run-speed.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-16T23:44:39.4738985Z packages/protocol test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/protocol[39m
2026-05-16T23:44:39.5575918Z packages/game-logic test:  [32m✓[39m test/wall-slide.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-16T23:44:39.7872462Z packages/game-logic test:  [32m✓[39m test/walkable-edge.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-16T23:44:39.7928197Z packages/game-logic test: [2m Test Files [22m [1m[32m12 passed[39m[22m[90m (12)[39m
2026-05-16T23:44:39.7941141Z packages/game-logic test: [2m      Tests [22m [1m[32m61 passed[39m[22m[90m (61)[39m
2026-05-16T23:44:39.7945814Z packages/game-logic test: [2m   Start at [22m 23:44:36
2026-05-16T23:44:39.7953092Z packages/game-logic test: [2m   Duration [22m 3.01s[2m (transform 207ms, setup 0ms, import 443ms, tests 115ms, environment 2ms)[22m
2026-05-16T23:44:39.8640334Z packages/game-logic test: Done
2026-05-16T23:44:39.9233507Z packages/protocol test:  [32m✓[39m test/codec.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-16T23:44:40.0952041Z packages/protocol test:  [32m✓[39m test/intents.test.ts [2m([22m[2m15 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-16T23:44:40.2632654Z packages/protocol test:  [32m✓[39m test/state.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T23:44:40.4159882Z packages/protocol test:  [32m✓[39m test/schema-shape.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-16T23:44:40.4185412Z packages/protocol test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-16T23:44:40.4193768Z packages/protocol test: [2m      Tests [22m [1m[32m41 passed[39m[22m[90m (41)[39m
2026-05-16T23:44:40.4195191Z packages/protocol test: [2m   Start at [22m 23:44:39
2026-05-16T23:44:40.4197276Z packages/protocol test: [2m   Duration [22m 925ms[2m (transform 148ms, setup 0ms, import 283ms, tests 38ms, environment 1ms)[22m
2026-05-16T23:44:40.4507621Z packages/protocol test: Done
2026-05-16T23:44:40.4512563Z apps/client test$ vitest run --exclude 'test/e2e/**'
2026-05-16T23:44:40.4515737Z apps/server test$ vitest run --exclude 'test/**/*.integ.test.ts'
2026-05-16T23:44:40.9819032Z apps/server test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/apps/server[39m
2026-05-16T23:44:41.0613962Z apps/client test: [1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/home/runner/work/rebno/rebno/apps/client[39m
2026-05-16T23:44:42.0738979Z apps/server test: {"level":30,"time":1778975082071,"pid":4451,"hostname":"runnervmrw5os","password":"[Redacted]","session_token":"[Redacted]","msg":"login"}
2026-05-16T23:44:42.0788507Z apps/server test:  [32m✓[39m test/otel-init.test.ts [2m([22m[2m4 tests[22m[2m)[22m[33m 738[2mms[22m[39m
2026-05-16T23:44:42.0831250Z apps/server test:      [33m[2m✓[22m[39m does not throw when OTEL_EXPORTER_OTLP_ENDPOINT is unset [33m 579[2mms[22m[39m
2026-05-16T23:44:42.6247391Z apps/server test:  [32m✓[39m test/layout-derive.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 158[2mms[22m[39m
2026-05-16T23:44:42.9999569Z apps/client test: [90mstderr[2m | src/__test__/game-scene.test.ts[2m > [22m[2mscenes/GameScene[2m > [22m[2mtest 5: onRoomLayout calls verifyRoomLayout first; render skipped on false
2026-05-16T23:44:43.0027534Z apps/client test: [22m[39mroom_layout signature did not verify — rendering anyway (defense-in-depth; see 06.1-D40-SPIKE.md) mvp-lobby 000
2026-05-16T23:44:43.1077569Z apps/client test:  [32m✓[39m src/__test__/game-scene.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 254[2mms[22m[39m
2026-05-16T23:44:43.7149944Z apps/server test:  [32m✓[39m test/persistence.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 72[2mms[22m[39m
2026-05-16T23:44:44.3659431Z apps/client test:  [32m✓[39m src/__test__/sprite-state-machine.teleport-gate.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 104[2mms[22m[39m
2026-05-16T23:44:44.6569907Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-16T23:44:44.6608377Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-SkoLQQ/rebno.db
2026-05-16T23:44:44.6628875Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-16T23:44:44.6667860Z apps/server test: [run-migrations] OK
2026-05-16T23:44:44.6812064Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-16T23:44:44.6815918Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-IEk9Zb/rebno.db
2026-05-16T23:44:44.6830394Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-16T23:44:44.6832824Z apps/server test: [run-migrations] reconciled __drizzle_migrations for pre-bootstrap DB (Assumption A7) — seeded 0001_baseline
2026-05-16T23:44:44.6834378Z apps/server test: [run-migrations] OK
2026-05-16T23:44:44.6885812Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-16T23:44:44.6908482Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-A9uSZT/rebno.db
2026-05-16T23:44:44.6933689Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-16T23:44:44.6945140Z apps/server test: [run-migrations] OK
2026-05-16T23:44:44.6964556Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-16T23:44:44.6988329Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-A9uSZT/rebno.db
2026-05-16T23:44:44.6998328Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-16T23:44:44.7017705Z apps/server test: [run-migrations] OK
2026-05-16T23:44:44.7065782Z apps/server test:  [32m✓[39m test/run-migrations.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 77[2mms[22m[39m
2026-05-16T23:44:45.0100142Z apps/server test:  [32m✓[39m test/log.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 23[2mms[22m[39m
2026-05-16T23:44:45.2889220Z apps/server test:  [32m✓[39m test/legacy-login.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 27[2mms[22m[39m
2026-05-16T23:44:45.5382194Z apps/client test:  [32m✓[39m src/__test__/chat-hud.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 127[2mms[22m[39m
2026-05-16T23:44:45.5779065Z apps/server test:  [32m✓[39m test/room-key.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 21[2mms[22m[39m
2026-05-16T23:44:45.8998378Z apps/server test:  [32m✓[39m test/static-assets.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 20[2mms[22m[39m
2026-05-16T23:44:46.1858891Z apps/server test: {"level":40,"time":1778975086181,"pid":4605,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-16T23:44:46.1922140Z apps/server test:  [32m✓[39m test/staging-invite.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 20[2mms[22m[39m
2026-05-16T23:44:46.1955674Z apps/server test: {"level":40,"time":1778975086185,"pid":4605,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-16T23:44:46.2016470Z apps/server test: {"level":40,"time":1778975086186,"pid":4605,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-16T23:44:46.4419969Z apps/server test:  [32m✓[39m test/rate-limit.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-16T23:44:46.6829207Z apps/server test:  [32m✓[39m test/admin-stubs.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-16T23:44:46.8215202Z apps/client test: [90mstderr[2m | src/__test__/background-renderer.test.ts[2m > [22m[2mBackgroundRenderer — wrap math (sim-tick pure state)[2m > [22m[2mD-64 round-4: dispose() survives a group whose .clear() throws (scene-shutdown race)
2026-05-16T23:44:46.8222008Z apps/client test: [22m[39mBackgroundRenderer.dispose: group.clear threw (likely scene-shutdown race) Cannot read properties of undefined (reading 'size')
2026-05-16T23:44:46.8228282Z apps/client test:  [32m✓[39m src/__test__/background-renderer.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 167[2mms[22m[39m
2026-05-16T23:44:47.5022894Z apps/server test: [90mstdout[2m | test/tick-accumulator.test.ts
2026-05-16T23:44:47.5024637Z apps/server test: [22m[39m◇ injected env (50) from ../../../../../../../etc/environment // tip: ⌘ override existing { override: true }
2026-05-16T23:44:47.5026049Z apps/server test: ℹ️  optional .env file not found: .env.test, .env
2026-05-16T23:44:48.0963443Z apps/client test:  [32m✓[39m src/__test__/esc-menu.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 121[2mms[22m[39m
2026-05-16T23:44:48.2469201Z apps/server test:  [32m✓[39m test/tick-accumulator.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 12[2mms[22m[39m
2026-05-16T23:44:48.5008910Z apps/server test:  [32m✓[39m test/health.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T23:44:48.5098081Z apps/server test: [2m Test Files [22m [1m[32m13 passed[39m[22m[90m (13)[39m
2026-05-16T23:44:48.5118264Z apps/server test: [2m      Tests [22m [1m[32m78 passed[39m[22m[90m (78)[39m
2026-05-16T23:44:48.5144230Z apps/server test: [2m   Start at [22m 23:44:40
2026-05-16T23:44:48.5179763Z apps/server test: [2m   Duration [22m 7.51s[2m (transform 552ms, setup 0ms, import 3.44s, tests 1.20s, environment 2ms)[22m
2026-05-16T23:44:48.5606569Z apps/server test: Done
2026-05-16T23:44:49.1152832Z apps/client test:  [32m✓[39m src/__test__/reconnect.test.ts [2m([22m[2m16 tests[22m[2m)[22m[32m 81[2mms[22m[39m
2026-05-16T23:44:49.8409301Z apps/client test:  [32m✓[39m src/__test__/force-reset-overlay.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 74[2mms[22m[39m
2026-05-16T23:44:50.5636073Z apps/client test:  [32m✓[39m src/__test__/nameplate.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 41[2mms[22m[39m
2026-05-16T23:44:51.2602264Z apps/client test:  [32m✓[39m src/__test__/nameplate-stability.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 24[2mms[22m[39m
2026-05-16T23:44:51.9465971Z apps/client test:  [32m✓[39m src/__test__/nameplate-color.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 33[2mms[22m[39m
2026-05-16T23:44:52.6295617Z apps/client test:  [32m✓[39m src/__test__/player-renderer-spawn-delay.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 20[2mms[22m[39m
2026-05-16T23:44:53.3323589Z apps/client test:  [32m✓[39m src/__test__/colyseus-client.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-16T23:44:54.0232862Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 19[2mms[22m[39m
2026-05-16T23:44:54.6967993Z apps/client test:  [32m✓[39m src/__test__/player-renderer.teleport.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-16T23:44:55.3662191Z apps/client test:  [32m✓[39m src/__test__/login-scene.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 12[2mms[22m[39m
2026-05-16T23:44:56.0358345Z apps/client test:  [32m✓[39m src/__test__/room-layout-verify.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-16T23:44:56.6878486Z apps/client test:  [32m✓[39m src/__test__/atlas-loader.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-16T23:44:57.3521988Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher-shift.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-16T23:44:58.0115226Z apps/client test:  [32m✓[39m src/__test__/boot-font-gate.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T23:44:58.6834857Z apps/client test:  [32m✓[39m src/__test__/sprite-state-machine.test.ts [2m([22m[2m29 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T23:44:59.3628345Z apps/client test:  [32m✓[39m src/__test__/reconciler.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T23:45:00.0954314Z apps/client test:  [32m✓[39m src/__test__/auth-client.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T23:45:00.7733476Z apps/client test:  [32m✓[39m src/__test__/room-collision-bottom-edge.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-16T23:45:01.4633437Z apps/client test:  [32m✓[39m src/__test__/prediction.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-16T23:45:02.1200573Z apps/client test:  [32m✓[39m src/__test__/room-renderer.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-16T23:45:02.7941760Z apps/client test:  [32m✓[39m src/__test__/extrapolation.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-16T23:45:03.4374207Z apps/client test:  [32m✓[39m src/__test__/protocol-version-check.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-16T23:45:04.1023553Z apps/client test:  [32m✓[39m src/__test__/sprite-state-rate.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-16T23:45:04.7768422Z apps/client test:  [32m✓[39m src/__test__/env.test.ts [2m([22m[2m5 tests[22m[2m | [22m[33m4 skipped[39m[2m)[22m[32m 4[2mms[22m[39m
2026-05-16T23:45:05.4678511Z apps/client test:  [32m✓[39m src/__test__/legacy-origin.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-16T23:45:06.1779606Z apps/client test:  [32m✓[39m src/__test__/depth-set.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-16T23:45:06.2006541Z apps/client test: [2m Test Files [22m [1m[32m31 passed[39m[22m[90m (31)[39m
2026-05-16T23:45:06.2012519Z apps/client test: [2m      Tests [22m [1m[32m223 passed[39m[22m[2m | [22m[90m4 todo[39m[90m (227)[39m
2026-05-16T23:45:06.2014083Z apps/client test: [2m   Start at [22m 23:44:41
2026-05-16T23:45:06.2016182Z apps/client test: [2m   Duration [22m 25.14s[2m (transform 886ms, setup 62ms, collect 1.68s, tests 1.20s, environment 14.47s, prepare 2.89s)[22m
2026-05-16T23:45:06.3316385Z apps/client test: Done
2026-05-16T23:45:06.3393383Z 
2026-05-16T23:45:06.3394145Z verify-phase-5: OK (7 steps green)
